package com.example.libbase.utils;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;

/**
 * 文件工具类
 *
 * @author hermit
 * @date 2021/7/3 21:17
 */
public class FileUtil {

    public static synchronized void makeDir(File f) {
        if (!f.exists()) {
            f.mkdir();
        }
    }

    public static void deleteDirFile(File f) {
        f.delete(); //del file
        f = null;
    }


    /* ======================================== *
     * Class Methods
     * ======================================== */


    public String getFileExt(String s) {
        String s1 = new String();
        int i = 0;
        int j = 0;
        if (s == null)
            return null;
        i = s.lastIndexOf(46) + 1;
        j = s.length();
        s1 = s.substring(i, j);
        if (s.lastIndexOf(46) > 0)
            return s1.toLowerCase();
        else
            return "";
    }

    private String getNameWithoutExtension(String fileName) {
        return fileName.substring(0, fileName.lastIndexOf("."));
    }

//    public boolean isImgFile(String file) {
//        if (UtilFuns.isNotEmpty(file)) {
//            String s1 = "." + this.getFileExt(file);
//            if (".jpg.jpeg.bmp.gif.png".indexOf(s1) > -1) {
//                return true;
//            }
//        }
//        return false;
//    }

    public String getFileName(String s) {
        try {
            s = s.replaceAll("/", "\\\\");
            int fileIndex = s.lastIndexOf("\\") + 1;
            return s.substring(fileIndex, s.length());
        } catch (Exception e) {
            return "";
        }
    }

    public String getFilePath(String s) {
        try {
            s = s.replaceAll("/", "\\\\");
            int fileIndex = s.lastIndexOf("\\");
            return s.substring(0, fileIndex);
        } catch (Exception e) {
            return "";
        }
    }

    /* 目录下已经有同名文件,则文件重命名,增加文件序号 add by tony 20110712 */
    public String newFile(String sPath, String sFile) {
        String newFileName = new String();
        String withoutExt = new String();
        File curFile = new File(sPath + "\\" + sFile);
        if (curFile.exists()) {
            for (int counter = 1; curFile.exists(); counter++) {
                withoutExt = this.getNameWithoutExtension(curFile.getName());
                if (withoutExt.endsWith(counter - 1 + ")")) {
                    withoutExt = withoutExt.substring(0, withoutExt.indexOf("(")); //idea
                }
                newFileName = withoutExt + "(" + counter + ")" + "." + getFileExt(curFile.getName());
                curFile = new File(sPath + "\\" + newFileName);
            }
        } else {
            newFileName = curFile.getName();
        }
        return newFileName;
    }

    /* 只清空文件夹，不删除文件夹 */
    public static synchronized void clearDir(String dir_path)
            throws FileNotFoundException {

        File file = new File(dir_path);
        if (!file.exists()) {
            throw new FileNotFoundException();
        }
        if (file.isDirectory()) {
            File[] fe = file.listFiles();
            for (int i = 0; i < fe.length; i++) {
                deleteFiles(fe[i].toString());
                fe[i].delete(); //删除已经是空的子目录
            }
        }
    }

    //ex: deleteDir(new File("c://aaa"));
    /* 清空文件夹，并删除文件夹 */
    public static synchronized void deleteDir(String dir_path)
            throws FileNotFoundException, IOException {
        deleteDir(new File(dir_path));
    }

    //ex: deleteDir(new File("c://aaa"));
    /* 清空文件夹，并删除文件夹 */
    public static synchronized void deleteDir(File f)
            throws FileNotFoundException, IOException {

        if (!f.exists()) {//文件夹不存在不存在
            throw new IOException("指定目录不存在:" + f.getName());
        }
        boolean rslt = true;//保存中间结果
        if (!(rslt = f.delete())) {//先尝试直接删除
//若文件夹非空。枚举、递归删除里面内容
            File subs[] = f.listFiles();
            for (int i = 0; i <= subs.length - 1; i++) {
                if (subs[i].isDirectory())
                    deleteDir(subs[i]);//递归删除子文件夹内容
                rslt = subs[i].delete();//删除子文件夹本身
            }
            rslt = f.delete();//删除此文件夹本身
        }
//if(!rslt)
//　throw new IOException("无法删除:"+f.getName());
//return;
    }

    //路径中的多层目录,如果不存在,则建立(mkdir－只可建最后一层目录)
    public static synchronized void makeDir(String dirPath)
            throws FileNotFoundException {
        String s = "";

        dirPath = dirPath.replaceAll("\\t", "/t"); //replace tab key
        dirPath = dirPath.replaceAll("\\\\", "/");
        String[] aPath = dirPath.split("/");
        for (int i = 0; i < aPath.length; i++) {
            s = s + aPath[i] + "/";
//System.out.println(s);
            File d = new File(s);
            if (!d.exists()) {
                d.mkdir();
            }
        }
    }

    //修改目录名称或文件名称 dir and file
    public static synchronized void rename(String sOld, String sNew)
            throws FileNotFoundException {
        boolean b = false;
        File d = new File(sOld);
        if (d.exists()) {
            b = d.renameTo(new File(sNew));
        }
    }

    public static synchronized String formulaDirName(String dirName) {
        dirName = dirName.replaceAll("/", "\\\\");
        return dirName;
    }

    public static synchronized String formulaPath(String dirName) {
        dirName = dirName.replaceAll("\\\\", "/");
        return dirName;
    }

    public static synchronized String lastDir(String dir_path) {
        if (dir_path.trim().compareTo("") == 0) {
            return "";
        } else {
            //两个位置，谁后取谁。因为路径中常包含这两种标识
            int i = dir_path.lastIndexOf("\\") > dir_path.lastIndexOf("/") ? dir_path.lastIndexOf("\\") : dir_path.lastIndexOf("/");
            if (i > 0) {
                return dir_path.substring(i);
            } else {
                return "";
            }
        }
    }

    //删除给定的文件
    public static void deleteFile(String FileName) {
        File f2 = new File(FileName);
        f2.delete(); //del file
        f2 = null;
    }

    /*
     *删除目录下的所有文件
     **/
    public static boolean deleteFiles(String dir) {
        if (dir == null || "".equals(dir))
            return true;

        File f0 = new File(dir);
        if (!f0.isDirectory())
            return false;
        File[] files = f0.listFiles();
        boolean status = true;
        for (int i = 0; i < files.length; i++) {
            File f = files[i];
            if (!f.isFile())
                continue;

            boolean b = f.delete();
            status = (status && b);
        }
        return status;
    }


    /**
     * Deletes each file in <tt>files</tt> which is under <tt>path</tt>.
     * It does not delete directory.
     *
     * @param path
     * @param files
     * @return <tt>true</tt> if and only if all the files are successfully
     * deleted; <tt>false</tt> otherwise.
     */
    public static boolean deleteFiles(String path, String[] files) {
        if (path == null || files == null)
            return true;

        boolean status = true;
        for (int i = 0; i < files.length; i++) {
            File f = new File(path, files[i]);
            if (!f.isFile())
                continue;
            //? (f.getAbsoluteFile()).
            boolean b = f.delete();
            status = (status && b);
        }
        return status;
    }

    public static boolean deleteFiles(List files) {

        if (files == null || files.size() <= 0)
            return true;

        String fileName = "";
        boolean status = true;
        for (int i = 0; i < files.size(); i++) {
            fileName = (String) files.get(i);
            File f = new File(fileName);
            if (!f.isFile())
                continue;
            //? (f.getAbsoluteFile()).
            boolean b = f.delete();
            status = (status && b);
        }
        return status;
    }

    /**
     * Copies byte-content of <tt>f</tt> to <tt>os</tt>.
     *
     * @param f
     * @param os
     * @throws IOException
     */
    public static void fileToOutputStream(File f, OutputStream os)
            throws IOException {
//
        InputStream is = new BufferedInputStream(new FileInputStream(f));
        byte[] barr = new byte[1024];
        int count;
        while (true) {
            count = is.read(barr);
            if (count == -1)
                break;

            os.write(barr, 0, count);
        }
        is.close();
        return;
    }

    //读日志文件 "c:\\Log.txt"
//输入参数：sFile = Path + FileName 文件路径＋文件名称
    public List<String> readTxtFile(String sFile) {
        String str = "";
        List<String> sList = new ArrayList<String>();
        try {
            FileReader fr = new FileReader(sFile);
            BufferedReader bfr = new BufferedReader(fr);
            while ((str = bfr.readLine()) != null) {
                sList.add(str);
            }
            fr.close();
        } catch (IOException ex) {
            System.out.println("readTxtFile IOException Error." + ex.getMessage());
        } catch (Exception ex) {
            System.out.println("readTxtFile Exception Error." + ex.getMessage());
        }
        return sList;
    }

    public String WriteTxt(String sPath, String sFile, String sContent) {
        String s = "";
        File d = new File(sPath);//建立代表Sub目录的File对象，并得到它的一个引用
        if (!d.exists()) {//检查Sub目录是否存在
            d.mkdir();//建立Sub目录
        }

        try {
            FileWriter fw = new FileWriter(sPath + "\\" + sFile, true);
            BufferedWriter bfw = new BufferedWriter(fw);
            bfw.write(sContent);
            bfw.flush();
            fw.close();
        } catch (IOException ex) {
            s = "WriteTxt IOException Error.";
        } catch (Exception ex) {
            s = "WriteTxt Exception Error.";
        }

        return s;
    }

    /* 创建新文本文件，如果文件已经存在则覆盖 */
    public String createTxt(String sPathFile, String sContent) throws FileNotFoundException {
        String s = "";
        String sPath = this.getFilePath(sPathFile);
        String sFile = this.getFileName(sPathFile);

        File d = new File(sPath); //建立代表Sub目录的File对象，并得到它的一个引用
        if (!d.exists()) { //检查Sub目录是否存在
            this.makeDir(sPath); //建立Sub目录
        }

        try {
            FileWriter fw = new FileWriter(sPath + "\\" + sFile, false);
            BufferedWriter bfw = new BufferedWriter(fw);
            bfw.write(sContent);
            bfw.flush();
            fw.close();
        } catch (IOException ex) {
            s = "createTxt IOException Error.";
        } catch (Exception ex) {
            s = "createTxt Exception Error.";
        }

        return s;
    }

    /* 创建新文本文件，如果文件已经存在则覆盖 */
    public String createTxt(String sPath, String sFile, String sContent) throws FileNotFoundException {
        String s = "";
        File d = new File(sPath); //建立代表Sub目录的File对象，并得到它的一个引用
        if (!d.exists()) { //检查Sub目录是否存在
            this.makeDir(sPath); //建立Sub目录
        }

        try {
            FileWriter fw = new FileWriter(sPath + "\\" + sFile, false);
            BufferedWriter bfw = new BufferedWriter(fw);
            bfw.write(sContent);
            bfw.flush();
            fw.close();
        } catch (IOException ex) {
            s = "createTxt IOException Error.";
        } catch (Exception ex) {
            s = "createTxt Exception Error.";
        }

        return s;
    }

    /* 创建新文本文件，如果文件已经存在则覆盖，在文件后追加内容 文件格式：encode:UTF-8 add by tony 20100118 */
    public String createTxt(String sPath, String sFile, String sContent, String enCoding) throws FileNotFoundException {
        String s = "";
        File d = new File(sPath); //建立代表Sub目录的File对象，并得到它的一个引用
        if (!d.exists()) { //检查Sub目录是否存在
            this.makeDir(sPath); //建立Sub目录
        }

        try {
            OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(sPath + "\\" + sFile), enCoding);
            out.write(sContent);
            out.flush();
            out.close();
        } catch (IOException ex) {
            s = "createTxt IOException Error.";
        } catch (Exception ex) {
            s = "createTxt Exception Error.";
        }

        return s;
    }

    /* 创建新文本文件，如果文件已经存在则覆盖，只覆盖不追加 文件格式：encode:UTF-8 add by tony 20100118 */
    public String newTxt(String sPath, String sFile, String sContent, String enCoding) throws FileNotFoundException {
        String s = "";
        File d = new File(sPath); //建立代表Sub目录的File对象，并得到它的一个引用
        if (!d.exists()) { //检查Sub目录是否存在
            this.makeDir(sPath); //建立Sub目录
        }

        try {
            OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(sPath + "\\" + sFile, false), enCoding);
            out.write(sContent);
            out.flush();
            out.close();
        } catch (IOException ex) {
            s = "createTxt IOException Error.";
        } catch (Exception ex) {
            s = "createTxt Exception Error.";
        }

        return s;
    }

    /*

    s = "c:\\ex.txt";
    String[] aTitle = null; //表示没有标题
    String[] aContent = {"a","b","c","a1","a2","a3"};

    sMsg = fileUtil.WriteTxt(s,aTitle,aContent,"\t",3); //\t TAB键

    */
    public String WriteTxt(String sFile, String[] aTitle, String[] aContent, String sSplitFlag, int iColumns) {
        String sMsg = "";
        long lTime = System.currentTimeMillis();
        try {
            if (aTitle != null) {
                if (aTitle.length != iColumns) {
                    throw new Exception("Title Length is not right!");
                }
            }

            File f = new File(sFile);
            if (f.exists()) {
                f.delete(); //if exist then delete()
            }

            FileWriter fw = new FileWriter(sFile, true);
            BufferedWriter bfw = new BufferedWriter(fw);

//write Title
            if (aTitle != null) {
                for (int i = 0; i < aTitle.length; i++) {
                    bfw.write(aTitle[i] + sSplitFlag);
                }
                bfw.newLine(); //插入换行符号
            }

//write content
            for (int i = 0; i < aContent.length; i++) {
                bfw.write(aContent[i] + sSplitFlag);

                if ((i + 1) % iColumns == 0) {
                    bfw.newLine(); //插入换行符号
                }
            }
            bfw.flush(); //将缓冲区内的数据写入文件中
            fw.close();
        } catch (IOException ex) {
            sMsg = "WriteTxt IOException Error." + ex.getMessage();
        } catch (Exception ex) {
            sMsg = "WriteTxt Exception Error." + ex.getMessage();
        }
        return sMsg;
    }


    //边生成边写XML文件 对单表结构
    public String WriteXML(String sFile, String indent, String root, String[] aTrunk, String[] aLeaf, String[] aContent) {
        int i = 0, j = 0, k = 0;
        String sIndent = "";
        String[] aTrunkSuffix = new String[aTrunk.length];
        String[] aLeafSuffix = new String[aLeaf.length];


        String sMsg = "";
        long lTime = System.currentTimeMillis();

        try {

            File f = new File(sFile);
            if (f.exists()) {
                f.delete(); //if exist then delete()
            }

//inital array
            for (i = 0; i < aTrunk.length; i++) {
                for (j = 0; j < i; j++) {
                    sIndent = indent + sIndent; //add space
                }
                aTrunk[i] = sIndent + "<" + aTrunk[i] + ">";
                aTrunkSuffix[i] = aTrunk[i].replaceFirst("<", "</");
//System.out.println(i + " " + aTrunk[i]+aTrunkSuffix[i]);
            }

            sIndent = indent + sIndent; //add space
            for (i = 0; i < aLeaf.length; i++) {
                aLeafSuffix[i] = "</" + aLeaf[i] + ">";
                aLeaf[i] = sIndent + "<" + aLeaf[i] + ">";
            }

            FileWriter fw = new FileWriter(sFile, true);
            BufferedWriter bfw = new BufferedWriter(fw);

            bfw.write("<?xml version=\"1.0\" ?>");
            bfw.newLine();
            if (root.length() > 0) {
                bfw.write("<" + root + ">");
                bfw.newLine();
            }

            while (k < aContent.length) {
                for (i = 0; i < aTrunk.length; i++) {
                    bfw.write(aTrunk[i]);
                    bfw.newLine();
                }
                for (i = 0; i < aLeaf.length; i++) {
                    bfw.write(aLeaf[i] + aContent[k++] + aLeafSuffix[i]);
                    bfw.newLine();
                }

                for (i = aTrunkSuffix.length - 1; i > -1; i--) {
                    bfw.write(aTrunkSuffix[i]);
                    bfw.newLine();
                }
            }//end while

            if (root.length() > 0) {
                bfw.write("</" + root + ">");
                bfw.newLine();
            }


            bfw.flush(); //将缓冲区内的数据写入文件中
            fw.close();
        } catch (IOException ex) {
            sMsg = this.getClass().getName() + " WriteXML IOException Error." + ex.getMessage();
        } catch (Exception ex) {
            sMsg = this.getClass().getName() + " WriteXML Exception Error." + ex.getMessage();
        }
        return sMsg;
    }


    //create xml lines to ArrayList
    public ArrayList CreateXML(String StartIndent, String indent, String[] aTrunk, String[] aLeaf, String[] aContent) {

        ArrayList aList = new ArrayList();

        int i = 0, j = 0, k = 0;
        String sIndent = StartIndent;
        String[] aTrunkSuffix = new String[aTrunk.length];
        String[] aLeafSuffix = new String[aLeaf.length];

        String sMsg = "";
        long lTime = System.currentTimeMillis();

        try {

//inital array
            for (i = 0; i < aTrunk.length; i++) {
                for (j = 0; j < i; j++) {
                    sIndent = indent + sIndent; //add space
                }
                aTrunk[i] = sIndent + "<" + aTrunk[i] + ">";
                aTrunkSuffix[i] = aTrunk[i].replaceFirst("<", "</");
            }

            sIndent = indent + sIndent; //add space
            for (i = 0; i < aLeaf.length; i++) {
                aLeafSuffix[i] = "</" + aLeaf[i] + ">";
                aLeaf[i] = sIndent + "<" + aLeaf[i] + ">";
            }

            while (k < aContent.length) {
                for (i = 0; i < aTrunk.length; i++) {
                    aList.add(aTrunk[i]);
                }
                for (i = 0; i < aLeaf.length; i++) {
                    aList.add(aLeaf[i] + aContent[k++] + aLeafSuffix[i]);
                }

                for (i = aTrunkSuffix.length - 1; i > -1; i--) {
                    aList.add(aTrunkSuffix[i]);
                }
            }//end while

            return aList;
        } catch (Exception ex) {
            sMsg = this.getClass().getName() + " CreateXML Exception Error." + ex.getMessage();
        }
        return null;
    }


    //边生成边写XML文件
    public String WriteXML(String sFile, String sXmlVer, String root, ArrayList aList) {

        String sMsg = "";
        long lTime = System.currentTimeMillis();
        try {

            File f = new File(sFile);
            if (f.exists()) {
                f.delete(); //if exist then delete()
            }

            FileWriter fw = new FileWriter(sFile, true);
            BufferedWriter bfw = new BufferedWriter(fw);

            bfw.write("<?" + sXmlVer + "?>");
            bfw.newLine();

            if (root.length() > 0) {
                bfw.write("<" + root + ">");
                bfw.newLine();
            }

//write txt
            for (int i = 0; i < aList.size(); i++) {
                bfw.write((String) aList.get(i));
                bfw.newLine();
            }

            if (root.length() > 0) {
//去掉元素后面的属性
                bfw.write("</" + root.substring(0, root.indexOf(" ")) + ">");
            }

            bfw.flush(); //将缓冲区内的数据写入文件中
            fw.close();
        } catch (IOException ex) {
            sMsg = this.getClass().getName() + " WriteXML IOException Error." + ex.getMessage();
        } catch (Exception ex) {
            sMsg = this.getClass().getName() + " WriteXML Exception Error." + ex.getMessage();
        }
        return sMsg;
    }

    public boolean isExist(String filename) {
        try {
            File file = new File(filename);
            if (!file.exists()) {
                return false;
            } else {
                return true;
            }
        } catch (Exception e) {
            return false;
        }
    }

    //用于判断是绝对路径还是相对路径 add by tony 20100413
    public boolean isAbsolutePath(String path) {
        if (path.indexOf(":") > 0) {
            return true;
        }
        return false;
    }

    /**
     * 功能:利用nio来快速复制文件
     */
    public void copyFile(String srcFile, String destFile)
            throws java.io.FileNotFoundException, java.io.IOException {
        FileInputStream fis = new FileInputStream(srcFile);
        FileOutputStream fos = new FileOutputStream(destFile);
        FileChannel fcin = fis.getChannel();
        FileChannel fcout = fos.getChannel();
        fcin.transferTo(0, fcin.size(), fcout);
        fcin.close();
        fcout.close();
        fis.close();
        fos.close();
    }


    /**
     * 忽略拷贝文件时发生的错误，可能是文件不存在
     */
    public boolean copyFileIgnore(String file1, String file2) {
        try {
            File file_in = new File(file1);
            File file_out = new File(file2);
            FileInputStream in1 = new FileInputStream(file_in);
            FileOutputStream out1 = new FileOutputStream(file_out);
            byte[] bytes = new byte[1024];
            int c;
            while ((c = in1.read(bytes)) != -1) {
                out1.write(bytes, 0, c);
            }
            in1.close();
            out1.close();
            return true; //if sucess then return true
        } catch (Exception e) {
            return false; //if fail then return false
        }

    }


    /* create by czs 2006-08-08 */
    public void copyDir(String dir1, String dir2) throws java.io.FileNotFoundException, IOException {
        (new File(dir2)).mkdir();
        File[] file = (new File(dir1)).listFiles();

        for (int i = 0; i < file.length; i++) {

            if (file[i].getName().compareTo("Thumbs.db") != 0) {
                if (file[i].isFile()) {
                    copyFile(dir1 + "\\" + file[i].getName(), dir2 + "\\" + file[i].getName());
                } else if (file[i].isDirectory()) {
                    copyDir(dir1 + "\\" + file[i].getName(), dir2 + "\\" + file[i].getName());
                }
            }
        }
    }

    /**
     * 功能:利用nio快速复制目录
     */
    public void copyDirectory(String srcDirectory, String destDirectory)
            throws java.io.FileNotFoundException, java.io.IOException { // 得到目录下的文件和目录数组

        File srcDir = new File(srcDirectory);
        File[] fileList = srcDir.listFiles();
// 循环处理数组

        if (fileList == null) {
            throw new java.io.FileNotFoundException();
        }

        (new File(destDirectory)).mkdir();

        for (int i = 0; i < fileList.length; i++) {
            if (fileList[i].isFile()) {
// 数组中的对象为文件
// 如果目标目录不存在，创建目标目录
                File descDir = new File(destDirectory);
                if (!descDir.exists()) {
                    descDir.mkdir();
                } // 复制文件到目标目录
                if (fileList[i].getName().compareTo("Thumbs.db") != 0) { //windows bug
                    copyFile(srcDirectory + "/" + fileList[i].getName(),
                            destDirectory + "/" + fileList[i].getName());
                }
            } else {
// 数组中的对象为目录
// 如果该子目录不存在就创建（其中也包含了对多级目录的处理）
                File subDir = new File(destDirectory + "/"
                        + fileList[i].getName());
                if (!subDir.exists()) {
                    subDir.mkdir();
                }
// 递归处理子目录
                copyDirectory(srcDirectory + "/" + fileList[i].getName(),
                        destDirectory + "/" + fileList[i].getName());

            }
        }
    }

    /* 列出目录下的所有文件 */
    public List fileList(String dir) {
        File f = new File(dir);
        File[] files = f.listFiles();
        if (files == null) {
            return null;
        }
        int count = files.length;
        List list = new ArrayList(count);
        for (int i = 0; i < count; i++) {
            if (!files[i].isDirectory()) {
                list.add(files[i]);
            }
        }
        return list;
    }

//    /* 列出目录下的所有文件，去除prefix路径~虚拟路径 */
//    public List fileList(String dir, String prefix) {
//        FormatStyle formatStyle = new FormatStyle();
//        File f = new File(dir);
//        File[] files = f.listFiles();
//        if (files == null) {
//            return null;
//        }
//        int count = files.length;
//        List list = new ArrayList(count);
//        for (int i = 0; i < count; i++) {
//            if (!files[i].isDirectory()) {
//                list.add(String.valueOf(files[i]).substring(prefix.length()));
//                list.add(formatStyle.fileSize(String.valueOf(files[i].length())));
//            }
//        }
//        return list;
//    }
//
//    /* 列出目录下前缀为prefix，后缀为suffix的文件 by tony 20110930 */
//    public List<String> fileList(String dir, String prefix, String suffix) {
//        FormatStyle formatStyle = new FormatStyle();
//        File f = new File(dir);
//        File[] files = f.listFiles();
//        if (files == null) {
//            return null;
//        }
//        int count = files.length;
//        List _list = new ArrayList(count);
//        for (int i = 0; i < count; i++) {
//            if (!files[i].isDirectory()) {
//                if (files[i].getName().startsWith(prefix) && files[i].getName().endsWith(suffix)) {
//                    _list.add(dir + "/" + files[i].getName());
//                }
//            }
//        }
//        return _list;
//    }


    /* 列出目录下的所有目录 */
    public List fileDir(String dir) {
        File f = new File(dir);
        File[] files = f.listFiles();
        if (files == null) {
            return null;
        }
        int count = files.length;
        List list = new ArrayList(count);
        for (int i = 0; i < count; i++) {
            if (files[i].isDirectory()) {
                list.add(files[i]);
            }
        }
        return list;
    }

//    /* 列出目录下的所有目录，去除prefix路径~虚拟路径 */
//    public List fileDir(String dir, String prefix) {
//        FormatStyle formatStyle = new FormatStyle();
//        File f = new File(dir);
//        File[] files = f.listFiles();
//        if (files == null) {
//            return null;
//        }
//        int count = files.length;
//        List list = new ArrayList(count);
//        for (int i = 0; i < count; i++) {
//            if (files[i].isDirectory()) {
//                list.add(String.valueOf(files[i]).substring(prefix.length()));
//                list.add(String.valueOf(files[i].listFiles().length));
//            }
//        }
//        return list;
//    }

    public List dirfileList(String dir) {
        File f = new File(dir);
        File[] files = f.listFiles();
        if (files == null) {
            return null;
        }
        int count = files.length;
        List list = new ArrayList(count);
        for (int i = 0; i < count; i++) {
            list.add(files[i]);
        }
        return list;
    }

    /**
     * Moving a File to Another Directory
     *
     * @param srcFile  eg: c:\windows\abc.txt
     * @param destPath eg: c:\temp
     * @return success
     */
    public boolean moveFile(String srcFile, String destPath) {
// File (or directory) to be moved
        File file = new File(srcFile);

// Destination directory
        File dir = new File(destPath);

// Move file to new directory
        boolean success = file.renameTo(new File(dir, file.getName()));

        return success;
    }

    /* ======================================== *
     * Tests Methods
     * ======================================== */

    public static void main(String[] args) throws IOException {
        FileUtil fu = new FileUtil();


//fu.copyDir("E:\\WorkSpace\\java\\pan\\userstyle\\one","E:\\WorkSpace\\java\\pan\\user\\test");
        fu.rename("c:\\t", "c:\\a");
//fu.fileList("E:\\WorkSpace\\java\\pan\\21pan");

//fu.copyDirectory("c:\\123","c:\\456");
//String dir = "D:\tmp\t/t";
//makeDir(dir);

/** FileUtil fu = new FileUtil();
 boolean copy_ok=fu.copyFile("E://WorkSpace//java//eCargo//comm//uploadfile//do_upload.jsp","E://WorkSpace//java//eCargo//comm//uploadfile//hello_backup.jsp");
 System.out.print(copy_ok);

 fu.copyDir("c:/eclog","c:/ec");

 String path = "d:/tmp";
 String f1 = "links.txt";
 boolean b = deleteFiles(path, new String[]{f1});
 System.out.println(b);

 FileUtil fileUtil = new FileUtil();
 String[] aTrunk = {"gaosin","ex"};
 String[] aLeaf = {"编号","姓名","标题","价格"};
 String[] aContent = {"a","b","c","d","a1","a2","a3","a4"};
 //String[] aContent = sqlDAO.CNRecordToStrings(sql);

 String sMsg = fileUtil.WriteXML("c:\\ex.xml"," ","gaosin-info",aTrunk,aLeaf,aContent);
 System.out.print(sMsg);

 try{
 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 DocumentBuilder builder=factory.newDocumentBuilder();
 Document doc=builder.parse("links.xml");
 doc.normalize();
 //---取得变量----
 String text="Wudong's Homepage";
 String url="www.wudong.com";
 String author="Wudong Liu";
 String discription="A site from Wudong Liu, give u lots of suprise!!!";
 //-------------
 Text textseg;
 Element link=doc.createElement("link");

 Element linktext=doc.createElement("text");
 textseg=doc.createTextNode(text);
 linktext.appendChild(textseg);
 link.appendChild(linktext);

 Element linkurl=doc.createElement("url");
 textseg=doc.createTextNode(url);
 linkurl.appendChild(textseg);
 link.appendChild(linkurl);

 Element linkauthor=doc.createElement("author");
 textseg=doc.createTextNode(author);
 linkauthor.appendChild(textseg);
 link.appendChild(linkauthor);

 java.util.Calendar rightNow = java.util.Calendar.getInstance();
 String day=Integer.toString(rightNow.get(java.util.Calendar.DAY_OF_MONTH));
 String month=Integer.toString(rightNow.get(java.util.Calendar.MONTH));
 String year=Integer.toString(rightNow.get(java.util.Calendar.YEAR));
 Element linkdate=doc.createElement("date");

 Element linkdateday=doc.createElement("day");
 textseg=doc.createTextNode(day);
 linkdateday.appendChild(textseg);

 Element linkdatemonth=doc.createElement("month");
 textseg=doc.createTextNode(month);
 linkdatemonth.appendChild(textseg);


 Element linkdateyear=doc.createElement("year");
 textseg=doc.createTextNode(year);
 linkdateyear.appendChild(textseg);

 linkdate.appendChild(linkdateday);
 linkdate.appendChild(linkdatemonth);
 linkdate.appendChild(linkdateyear);
 link.appendChild(linkdate);

 Element linkdiscription=doc.createElement("description");
 textseg=doc.createTextNode(discription);
 linkdiscription.appendChild(textseg);
 link.appendChild(linkdiscription);

 doc.getDocumentElement().appendChild(link);

 TransformerFactory tFactory =TransformerFactory.newInstance();
 Transformer transformer = tFactory.newTransformer();
 DOMSource source = new DOMSource(doc);
 StreamResult result = new StreamResult(new java.io.File("links.xml"));
 transformer.transform(source, result);
 }catch(Exception e){
 e.printStackTrace();
 }
 */
    }

}
